"""
threading模块中的Lock类
    - 创建锁对象：lock = threading.Lock()
    - 上锁：lock.acquire()
    - 解锁：lock.release()
    - with语句：with lock: pass
    - 使用锁的原则
        - 把尽量少的和不耗时的代码放到锁中执行
        - 代码执行后记得释放锁
"""

import threading


num = 50
lock = threading.Lock()


def sub():
    """
    线程函数
    """
    global num
    for _ in range(1000):
        # 第一种方式，使用with语句
        # with lock:
        #     if num > 0:
        #         print(f'子线程{threading.current_thread().name}执行结束，num={num}')
        #         num -= 1

        # 第二种方式，使用acquire()和release()方法
        lock.acquire()
        if num > 0:
            print(f'子线程{threading.current_thread().name}执行结束，num={num}')
            num -= 1
        lock.release()


if __name__ == '__main__':
    print('开始前...：num =', num)

    items = [threading.Thread(target=sub) for _ in range(3)]

    for item in items:
        item.start()
        item.join()

    print('结束后：num =', num)
